#include "stdafx.h"
#include "texgl.h"

TexGL::TexGL(void){
	glEnable(GL_TEXTURE_2D);							// Abilita il Texture Mapping 
	//glBindTexture(GL_TEXTURE_2D, texture[0]);
	}

TexGL::~TexGL(void){}

// carica una texture bitmap
AUX_RGBImageRec *TexGL::LoadBMP(CString filename)
{
	CFile f;
	if (f.Open(filename,CFile::modeRead))
	{	
		f.Close();
		return auxDIBImageLoad(filename);				// Carica la Bitmap e restituisce un puntatore
	}

	return NULL;				
}

int TexGL::LoadGLTexture(CString filename,short mode = 0)									// Carica la Bitmap e la converte in Texture
{
	int Status = FALSE;									// Indicatore dello stato 

	AUX_RGBImageRec *TextureImage[1];					// Crea spazio per la texture

	memset(TextureImage,0,sizeof(void *)*1);           	// Setta il puntatore a NULL

	// Carica la Bitmap, testa per errori, se la Bitmap non viene trovata chiude
	if (TextureImage[0]=LoadBMP(filename))
	{
		Status=TRUE;									// Setta la variabile Status a TRUE

		glGenTextures(1, &texture);					// Crea la Texture

		// Tipica gerazione di Texture usando i dati dalla Bitmap
		glBindTexture(GL_TEXTURE_2D, texture);
		glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
		
		switch(mode)
		{
			case 0:
				glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
				glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
				glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
			break;

			case 1:
				glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
				glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
				glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
			break;
			
			case 2:
				glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
				glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
				gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
			break;

			default:
				glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
				glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
				glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
			break;
		}
	
	 
	}
	
	if (TextureImage[0])									// Testa se la Texture esiste
	{
		if (TextureImage[0]->data)							// Testa se l'immagine Texture esiste
		{
			free(TextureImage[0]->data);					// Libera la memoria per l'immagine Texture 
		}

		free(TextureImage[0]);								// Libera la struttura immagine
	}

	return Status;										// Restituisce la variabile Status
}